home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
datelib.exe
/
DIFFDATE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
11KB
|
331 lines
static char diffdate_prog[] = "@(#)long diffdate(char *d1,char *d2) - Datumsdifferenzen in Tagen";
static char diffdate_ver[] = "@(#)v1.11/kr ; 22.08.91";
/* Autor Klaus Rath
**
** Deklaration long diffdate(char *datum1, char *datum2);
**
** Übergabe Erwartet werden 2 Strings in folgenden optionalen Formaten:
** tt.mm.[[jj]jj] -- deutsches Format
** mm/tt[/[jj]jj] -- amerikanisches Format
** [jj]jjmmtt -- DDB/4-Format
** wobei der Trenner '.' oder '/' bestimmt, ob deutsches oder
** amerikanisches Datumsformat berücksichtigt wird - bzw. Daten-
** bankformat, falls kein Trenner vorhanden ist. Da die beiden
** Datümer einzeln geprüft und konvertiert werden, dürfen unter-
** schiedliche Formate verwendet werden! Falls kein Jahrhundert
** mit übergeben wurde, nimmt die Funktion an, daß das aktuelle
** gemeint ist und holt es sich aus der Systemzeit!
** Rückgabe Zurückgegeben wird die Differenz in Tagen als long-Wert.
** Da eine Differenz von 0 Tagen ja durchaus vorkommen kann, eignet
** sich die 0 nicht als Fehlerkennung. diffdate gibt für diesen
** Fall die Zahl 90909090 zurück, deren normales Zustandekommen
** ziemlich unwahrscheinlich sein dürfte.
** Anmerkung Die Funktion verwendet die Funktionen schalt_jahr und anz_schaltj,
** die entsprechend mit eingebunden werden müssen.
** Der Bereich, in dem diffdate arbeiten kann, liegt
** zwischen dem 01.01.0000 und dem 31.12.9999 !!!
** Änderungen 1.00 ; 12.04.91
** Erste vollwertige Version
** 1.10 ; 20.05.91
** Anpassung an die Formate tt.mm. und mm/tt, bei denen auch
** das Jahr durch das aktuelle belegt werden muß.
** Benutzung der Funktion anz_schaltjahre().
** 1.11 ; 22.08.91
** Fehler beseitigt, der zur Differenz von einem Tag führte,
** wenn Ergebnis negativ war und das erste Datum in einem
** Schaltjahr liegt. Die Monatslängensetzung mlaen[2] muß dann
** wieder auf 28 zurückgesetzt werden!!
*/
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <sys\types.h>
#ifdef __TURBOC__
#include <stdlib.h>
#endif
#include "datum.h"
long diffdate(char *date1, char *date2)
{
long tages_summe1,tages_summe2;
long ergebnis;
long jahreszahl1,jahreszahl2;
char t_s1[3],t_s2[3],m_s1[3],m_s2[3],j_s1[3],j_s2[3],jh_s1[3],jh_s2[3];
long tage1,tage2,monate1,monate2,jahre1,jahre2,jh1,jh2;
int laenge1,laenge2;
char systemzeit_s[26];
time_t systemzeit;
long zaehler;
long mlaen[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
long anz_sj;
/* Längenüberprüfung :
*/
laenge1 = strlen(date1);
if ( laenge1 == 6 || laenge1 == 8 || laenge1 == 10 || laenge1 == 5 )
;
else
return((long)FEHLER);
laenge2 = strlen(date2);
if ( laenge2 == 6 || laenge2 == 8 || laenge2 == 10 || laenge2 == 5 )
;
else
return((long)FEHLER);
/* Jahrhundert und Jahr aus der Systemzeit ermitteln und vorbelegen :
*/
time(&systemzeit);
strcpy(systemzeit_s,ctime(&systemzeit));
jh_s1[0] = systemzeit_s[20];
jh_s1[1] = systemzeit_s[21];
jh_s1[2] = '\0';
j_s1[0] = systemzeit_s[22];
j_s1[1] = systemzeit_s[23];
j_s1[2] = '\0';
jh_s2[0] = systemzeit_s[20];
jh_s2[1] = systemzeit_s[21];
jh_s2[2] = '\0';
j_s2[0] = systemzeit_s[22];
j_s2[1] = systemzeit_s[23];
j_s2[2] = '\0';
/* Format überprüfen und umkopieren :
*/
/* 1. Datum :
*/
if ( date1[2] == '.' && date1[5] == '.' ) { /* deutsches Format */
t_s1[0] = date1[0];
t_s1[1] = date1[1];
t_s1[2] = '\0';
m_s1[0] = date1[3];
m_s1[1] = date1[4];
m_s1[2] = '\0';
if ( laenge1 == 10 ) {
jh_s1[0] = date1[6];
jh_s1[1] = date1[7];
jh_s1[2] = '\0';
j_s1[0] = date1[8];
j_s1[1] = date1[9];
j_s1[2] = '\0';
}
else if ( laenge1 == 8 ) {
j_s1[0] = date1[6];
j_s1[1] = date1[7];
j_s1[2] = '\0';
}
else if ( laenge1 == 6 ) ;
else
return((long)FEHLER);
} /* ENDE: Deutsches Format */
else if ( date1[2] == '/' &&
( date1[5] == '/' || laenge1 == 5 ) ) { /* amerik.Format */
t_s1[0] = date1[3];
t_s1[1] = date1[4];
t_s1[2] = '\0';
m_s1[0] = date1[0];
m_s1[1] = date1[1];
m_s1[2] = '\0';
if ( laenge1 == 10 ) {
jh_s1[0] = date1[6];
jh_s1[1] = date1[7];
jh_s1[2] = '\0';
j_s1[0] = date1[8];
j_s1[1] = date1[9];
j_s1[2] = '\0';
}
else if ( laenge1 == 8 ) {
j_s1[0] = date1[6];
j_s1[1] = date1[7];
j_s1[2] = '\0';
}
else if ( laenge1 == 5 ) ;
else
return((long)FEHLER);
} /* ENDE: Amerikanisches Format */
else if ( atol(date1) != (long)NULL ) { /* Datenbank-Format */
if ( laenge1 == 8 ) {
jh_s1[0] = date1[0];
jh_s1[1] = date1[1];
jh_s1[2] = '\0';
j_s1[0] = date1[2];
j_s1[1] = date1[3];
j_s1[2] = '\0';
t_s1[0] = date1[6];
t_s1[1] = date1[7];
t_s1[2] = '\0';
m_s1[0] = date1[4];
m_s1[1] = date1[5];
m_s1[2] = '\0';
}
else if ( laenge1 == 6 ) {
j_s1[0] = date1[0];
j_s1[1] = date1[1];
j_s1[2] = '\0';
t_s1[0] = date1[4];
t_s1[1] = date1[5];
t_s1[2] = '\0';
m_s1[0] = date1[2];
m_s1[1] = date1[3];
m_s1[2] = '\0';
}
else
return((long)FEHLER);
} /* ENDE: Datenbankformat */
else
return((long)FEHLER);
/* ENDE:if(Formatprüfung und Kopierung für 1.Datum) */
/* 2. Datum :
*/
if ( date2[2] == '.' && date2[5] == '.' ) { /* deutsches Format */
t_s2[0] = date2[0];
t_s2[1] = date2[1];
t_s2[2] = '\0';
m_s2[0] = date2[3];
m_s2[1] = date2[4];
m_s2[2] = '\0';
if ( laenge2 == 10 ) {
jh_s2[0] = date2[6];
jh_s2[1] = date2[7];
jh_s2[2] = '\0';
j_s2[0] = date2[8];
j_s2[1] = date2[9];
j_s2[2] = '\0';
}
else if ( laenge2 == 8 ) {
j_s2[0] = date2[6];
j_s2[1] = date2[7];
j_s2[2] = '\0';
}
else if ( laenge2 == 6 ) ;
else
return((long)FEHLER);
} /* ENDE: Deutsches Format */
else if ( date2[2] == '/' &&
( date2[5] == '/' || laenge2 == 5 ) ) { /* amerik.Format */
t_s2[0] = date2[3];
t_s2[1] = date2[4];
t_s2[2] = '\0';
m_s2[0] = date2[0];
m_s2[1] = date2[1];
m_s2[2] = '\0';
if ( laenge2 == 10 ) {
jh_s2[0] = date2[6];
jh_s2[1] = date2[7];
jh_s2[2] = '\0';
j_s2[0] = date2[8];
j_s2[1] = date2[9];
j_s2[2] = '\0';
}
else if ( laenge2 == 8 ) {
j_s2[0] = date2[6];
j_s2[1] = date2[7];
j_s2[2] = '\0';
}
else if ( laenge2 == 5 ) ;
else
return((long)FEHLER);
} /* ENDE: Amerikanisches Format */
else if ( atol(date2) != (long)NULL ) { /* Datenbank-Format */
if (